From 8bd0572c9cd8c2a1c95b24d43654ef0918f586c9 Mon Sep 17 00:00:00 2001 From: Peter Atashian Date: Tue, 20 Jan 2015 11:01:52 -0500 Subject: [PATCH] Use external crates for Windows FFI Signed-off-by: Peter Atashian --- Cargo.lock | 15 ++++++++++++++ Cargo.toml | 8 +++++++ src/cargo/util/sha256.rs | 45 ++++++++-------------------------------- 3 files changed, 32 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68a69f076..632455a26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,7 @@ name = "cargo" version = "0.1.0" dependencies = [ + "advapi32-sys 0.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "curl 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "docopt 0.6.30 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -17,6 +18,15 @@ dependencies = [ "time 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "advapi32-sys" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -224,3 +234,8 @@ dependencies = [ "rustc-serialize 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "winapi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + diff --git a/Cargo.toml b/Cargo.toml index d6215a66b..43d881da5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,14 @@ url = "0.2" rustc-serialize = "0.2" term = "0.1" +[target.i686-pc-windows-gnu.dependencies] +winapi = "0.1" +advapi32-sys = "*" + +[target.x86_64-pc-windows-gnu.dependencies] +winapi = "0.1" +advapi32-sys = "*" + [dev-dependencies.hamcrest] git = "https://github.com/carllerche/hamcrest-rust.git" diff --git a/src/cargo/util/sha256.rs b/src/cargo/util/sha256.rs index b9646c4a4..40d7518bf 100644 --- a/src/cargo/util/sha256.rs +++ b/src/cargo/util/sha256.rs @@ -70,42 +70,15 @@ mod imp { // Leverage the crypto APIs that windows has built in. #[cfg(windows)] mod imp { + extern crate winapi; + extern crate "advapi32-sys" as advapi32; use std::os; + use std::ptr; - use libc; - use libc::{DWORD, BYTE, LPCSTR, BOOL}; - use libc::types::os::arch::extra::{LONG_PTR}; - - type HCRYPTPROV = LONG_PTR; - type HCRYPTHASH = LONG_PTR; - type HCRYPTKEY = LONG_PTR; - type ALG_ID = libc::c_uint; - - static PROV_RSA_AES: DWORD = 24; - static CRYPT_SILENT: DWORD = 64; - static CRYPT_VERIFYCONTEXT: DWORD = 0xF0000000; - static CALG_SHA_256: ALG_ID = 0x800c; - static HP_HASHVAL: DWORD = 0x00000002; - - #[allow(non_snake_case)] - extern "system" { - fn CryptAcquireContextA(phProv: *mut HCRYPTPROV, - pszContainer: LPCSTR, - pszProvider: LPCSTR, - dwProvType: DWORD, - dwFlags: DWORD) -> BOOL; - fn CryptReleaseContext(hProv: HCRYPTPROV, dwFlags: DWORD) -> BOOL; - - - fn CryptCreateHash(hProv: HCRYPTPROV, Algid: ALG_ID, hKey: HCRYPTKEY, - dwFlag: DWORD, phHash: *mut HCRYPTHASH) -> BOOL; - fn CryptHashData(hHash: HCRYPTHASH, pbData: *mut BYTE, dwDataLen: DWORD, - dwFlags: DWORD) -> BOOL; - fn CryptGetHashParam(hHash: HCRYPTHASH, dwParam: DWORD, pbData: *mut BYTE, - pdwDataLen: *mut DWORD, dwFlags: DWORD) -> BOOL; - - fn CryptDestroyHash(hHash: HCRYPTHASH) -> BOOL; - } + use self::winapi::{DWORD, HCRYPTPROV, HCRYPTHASH}; + use self::winapi::{PROV_RSA_AES, CRYPT_SILENT, CRYPT_VERIFYCONTEXT, CALG_SHA_256, HP_HASHVAL}; + use self::advapi32::{CryptAcquireContextW, CryptCreateHash, CryptDestroyHash}; + use self::advapi32::{CryptGetHashParam, CryptHashData, CryptReleaseContext}; macro_rules! call{ ($e:expr) => ({ if $e == 0 { @@ -122,7 +95,7 @@ mod imp { pub fn new() -> Sha256 { let mut hcp = 0; call!(unsafe { - CryptAcquireContextA(&mut hcp, 0 as LPCSTR, 0 as LPCSTR, + CryptAcquireContextW(&mut hcp, ptr::null(), ptr::null(), PROV_RSA_AES, CRYPT_VERIFYCONTEXT | CRYPT_SILENT) }); @@ -143,7 +116,7 @@ mod imp { pub fn finish(&mut self) -> [u8; 32] { let mut ret = [0u8; 32]; - let mut len = ret.len() as libc::DWORD; + let mut len = ret.len() as DWORD; call!(unsafe { CryptGetHashParam(self.hcrypthash, HP_HASHVAL, ret.as_mut_ptr(), &mut len, 0) -- 2.30.2